<?

class ToolsController extends Controller{
    
    function actionTaskaction(){
        
        $R = new AjaxResult;
        
        $avOp = array('start', 'stop', 'pause_start', 'pause_stop', 'check', 'savecomment', 'testing', 'away', 'cancle', 'archive');
        $op = trim(substr(htmlspecialchars($_GET['op']), 0, 60));
        
        if(in_array($op, $avOp)){
            
            $taskID = intval($_GET['taskID']);
            $taskID = $taskID > 0 ? $taskID : intval($_POST['taskID']);
            
            $TASK = Task::model()->findByPk($taskID);
            if(!$TASK){
                $R->setMessage('Задача не найдена');
            }else{
                $TaskInProgress = TaskTime::model()->findByAttributes(array(
                    'task_id' => $taskID,
                    'user_id' => Yii::app()->user->id,
                    'time_end' => 0
                ));
                if($op == 'start'){
                    $TT = new TaskTime;
                    $TT->task_id = $taskID;
                    $TT->user_id = Yii::app()->user->id;
                    $TT->time_start = time();
                    $TT->time_end = 0;
                    $TT->time_break = 0;
                    $TT->save();
                    if($TT->id > 0){
                        $R->set(AjaxResult::TYPE_SUCCESS, 'Вы начали выполнение задачи #'.$taskID);
                        $TASK->status(TaskModule::t('fields', 'В процессе'), true);
                    }
                }
                
                if($op == 'stop'){
                    if($TaskInProgress){
                        if(isset($_SESSION['breaktask'][$taskID]) && $_SESSION['breaktask'][$taskID] > 0){
                            $TaskInProgress->time_break += time()-$_SESSION['breaktask'][$taskID];
                        }
                        $TaskInProgress->time_end = time();
                        $TaskInProgress->save();
                        $R->set(AjaxResult::TYPE_SUCCESS, 'Вы закончили выполнение задачи #'.$taskID);
                        $TASK->status(TaskModule::t('fields', 'В очереди'), true);
                    }
                }
                
                if($op == 'pause_start'){
                    $_SESSION['breaktask'][$taskID] = time();
                    $R->set(AjaxResult::TYPE_SUCCESS, 'Вы приостановили выполнение задачи #'.$taskID);
                }
                
                if($op == 'pause_stop'){
                    $_SESSION['breaktask'][$taskID] = $_SESSION['breaktask'][$taskID] > 0 ? $_SESSION['breaktask'][$taskID] : time();
                    $time = time() - $_SESSION['breaktask'][$taskID];
                    if($TaskInProgress){
                        $TaskInProgress->time_break += $time;
                        $TaskInProgress->save();
                        $R->set(AjaxResult::TYPE_SUCCESS, 'Вы возобновили выполнение задачи #'.$taskID);
                        unset($_SESSION['breaktask'][$taskID]);
                    }
                }
                
                if($op == 'check'){
                    if($TaskInProgress){
                        $break = isset($_SESSION['breaktask'][$taskID]) ? time() - $_SESSION['breaktask'][$taskID] : 0;
                        $time = time() - $TaskInProgress->time_start - $TaskInProgress->time_break - $break;
                        $R->set(AjaxResult::TYPE_SUCCESS, 'Задача #'.$taskID.' в процессе выполнения', array(
                            'time' => TaskTime::timeFormat($time)
                        ));
                    }
                }
                
                if($op == 'savecomment'){
                    if($TaskInProgress){
                        $TaskInProgress->comment = trim($_POST['comment']);
                        $TaskInProgress->save();
                        $R->set(AjaxResult::TYPE_SUCCESS, 'Комментарий успешно сохранен');
                    }
                }
                
                if($op == 'testing'){
                    $TASK->status(TaskModule::t('fields', 'Ожидает проверки'));
                    $R->set(AjaxResult::TYPE_SUCCESS, 'Задача отправлена на проверку');
                }
                
                if($op == 'away'){
                    $TASK->status(TaskModule::t('fields', 'Отложена'));
                    $R->set(AjaxResult::TYPE_SUCCESS, 'Задача отложена');
                }
                
                if($op == 'cancle'){
                    $TASK->status(TaskModule::t('fields', 'Отменена'));
                    $R->set(AjaxResult::TYPE_SUCCESS, 'Задача отменена');
                }
                
                if($op == 'archive'){
                    $TASK->archived = 1;
                    $TASK->save();
                    $R->set(AjaxResult::TYPE_SUCCESS, 'Задача архивирована');
                }
            }
        }else{
            $R->setMessage('Недоступная операция (op)');
        }
        
        echo $R;
        
    }
    
    function actionAjaxsearchmember(){
        if(isset($_GET['term'])){
            $q = trim(substr(strip_tags($_GET['term']), 0, 60));
            $users = array();
            $criteria = new CDbCriteria;
            $criteria->addSearchCondition('nick', $q, true, 'OR');
            $criteria->addSearchCondition('email', $q, true, 'OR');
            $criteria->addSearchCondition('name', $q, true, 'OR');
            $criteria->addSearchCondition('lname', $q, true, 'OR');
            $criteria->limit=10;
            $USER = TaskUser::model()->findAll($criteria);
            foreach($USER as $U){
                $users[] = '['.$U->id.'] '.TaskUser::model()->roleChoices[$U->role].' '.$U->name.' '.$U->lname;
            }
            echo CJavaScript::jsonEncode($users);
        }
    }
    
    function actionSavetaskstatus(){
        $R = new AjaxResult;
        $status = intval($_POST['status']);
        if(!in_array($status, Task::model()->rstatuses)) $R->setMessage(TaskModule::t('messages', 'Неверный код статуса.'));
        else{
            $_taskID = intval($_GET['taskID']);
            if($_taskID <= 0) $R->setMessage(TaskModule::t('messages', 'Неверный ID задачи.'));
            else{
                $TASK = Task::model()->findByPk($_taskID);
                if(!$TASK) $R->setMessage(TaskModule::t('messages', 'Задача ID {ID} не найдена.', array('{ID}'=>$_taskID)));
                else{
                    $TASK->status = $status;
                    $TASK->save();
                    $R->set(AjaxResult::TYPE_SUCCESS, 'Статус задачи успешно изменен.');
                }
            }
        }
        $R->multiResult(CHtml::normalizeUrl($_GET['backurl']));
    }
    
    function actionSavetaskposition(){
        $R = new AjaxResult;
        $pool = $_GET['pool'];
        if(!is_array($pool)) $pool = array($pool);
        $sorts = $_GET['sorts'];
        if(!is_array($sorts)) $sorts = array($sorts);
        foreach($pool as $k=>$tID){
            $T = Task::model()->findByPk($tID);
            if($T){
                $T->sort = intval($sorts[$k]);
                $T->save();
            }
        }
        $R->set(AjaxResult::TYPE_SUCCESS, TaskModule::t('message', 'Порядок успешно сохранен.'));
        $R->multiResult(CHtml::normalizeUrl($_GET['backurl']));
    }
    
    function actionAddtaskresponsible(){
        $taskID = intval($_GET['taskID']);
        if($taskID <= 0){
            echo CHtml::script('$().toastmessage(\'showErrorToast\', \''.TaskModule::t('message', 'Неверный ID задачи.').'\');');
        }else{
            $TASK = Task::model()->findByPk($taskID);
            if(!$TASK){
                echo CHtml::script('$().toastmessage(\'showErrorToast\', \''.TaskModule::t('message', 'Задача ID {ID} не найдена.', array('{ID}'=>$taskID)).'\');');
            }else{
                $responsible = trim(substr(strip_tags($_POST['responsible']), 0, 300));
                if(!preg_match('|\[(\d)+\]|is', $responsible, $m)){
                    echo CHtml::script('$().toastmessage(\'showErrorToast\', \''.TaskModule::t('message', 'Не удалось определить пользователя из запроса.').'\');');
                }else{
                    $userID = intval($m[1]);
                    $USER = TaskUser::model()->findByPk($userID);
                    if(!$USER){
                        echo CHtml::script('$().toastmessage(\'showErrorToast\', \''.TaskModule::t('message', 'Пользователь не найден.').'\');');
                    }else{
                        $TRU = new TaskResponsibleUser;
                        $_TRU = $TRU->findByAttributes(array(
                            'task_id' => $taskID,
                            'user_id' => $userID
                        ));
                        if($_TRU){
                            echo CHtml::script('$().toastmessage(\'showNoticeToast\', \''.TaskModule::t('message', 'Пользователь уже назвачен ответственным.').'\');');
                        }else{
                            $TRU->task_id = $taskID;
                            $TRU->user_id = $userID;
                            $TRU->save();
                            if($TRU->hasErrors()){
                                echo CHtml::script('$().toastmessage(\'showErrorToast\', \''.TaskModule::t('message', 'Ошибка сохранения привязки.').'\');');
                            }else{
                                if(!empty($USER->email)){
                                    $message = new YiiMailMessage;
                                    $message->setSubject(Yii::app()->name.'# Вы назначены ответственным к задаче');
                                    $message->view = 'modules.task.views.mail.addtaskresponsible';
                                    $message->setBody(array(
                                        'USER' => $USER,
                                        'TASK' => $TASK,
                                    ), 'text/html');
                                    
                                    $message->addTo($USER->email);
                                    $message->setFrom($this->getModule()->emailSender);
                                    echo debug(Yii::app()->mail->send($message));
                                }
                                $TASK->status(TaskModule::t('fields', 'В очереди'), true);
                                echo CHtml::script('$().toastmessage(\'showSuccessToast\', \''.TaskModule::t('message', 'Ответственный успешно назначен.').'\');');
                            }
                        }
                    }
                }
                $list = array();
                $TRULIST = TaskResponsibleUser::model()->with('user')->findAllByAttributes(array(
                    'task_id' => $taskID
                ));
                foreach($TRULIST as $TRU){
                    $U = $TRU->getRelated('user');
                    array_push($list, $U->getLink());
                }
                echo implode(', ', $list);
            }
        }
    }
    
    function actionTaskcommentsave(){
        $html = '';
        $taskID = intval($_GET['taskID']);
        if($taskID <= 0){
            $html .= CHtml::script('$().toastmessage(\'showErrorToast\', \''.TaskModule::t('message', 'Неверный ID задачи.').'\');');
        }else{
            $TASK = Task::model()->findByPk($taskID);
            if(!$TASK){
                $html .= CHtml::script('$().toastmessage(\'showErrorToast\', \''.TaskModule::t('message', 'Задача ID {ID} не найдена.', array('{ID}'=>$taskID)).'\');');
            }else{
                $NEWCOMMENT = new FormNewTaskComment;
                $NEWCOMMENT->text = trim(substr(strip_tags($_POST['text']), 0, 4000));
                $NEWCOMMENT->parent_id = intval($_POST['parentID']);
                $NEWCOMMENT->task_id = $taskID;
                if($NC = $NEWCOMMENT->save()){
                    $html .= CHtml::script('$().toastmessage(\'showSuccessToast\', \''.TaskModule::t('message', 'Комментарий успешно добавлен.').'\');');
                    $html .= CHtml::script('location.hash = \'comments-'.$NC->task_id.'\'');
                }else{
                    $html .= CHtml::script('$().toastmessage(\'showErrorToast\', \''.TaskModule::t('message', 'Ошибка создания комментария.').'\');');
                }
            }
            if(CHttpRequest::getIsAjaxRequest()){
                echo $html;
                $TASK = Task::model()->with('comments')->findByPk($taskID);
                $this->renderPartial('application.modules.task.views.task._list_comment', array(
                    'TASK' => $TASK,
                    'display' => 'block'
                ));
            }else{
                $backurl = CHtml::normalizeUrl($_GET['backurl']);
                $backurl = !$backurl ? $_SERVER['HTTP_REFERER'] : $backurl;
                $this->redirect($backurl);
            }
        }
    }
    
}
